package MT;

import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;
import java.util.Stack;

public class MT2023_10_03 {

    /**
     * 小美和小团所在公司的食堂有N张餐桌，从左到右摆成一排，每张餐桌有2张餐椅供至多2人用餐，公司职员排队进入食堂用餐。小美发现职员用餐的一个规律并告诉小团：当男职员进入食堂时，他会优先选择已经坐有1人的餐桌用餐，只有当每张餐桌要么空着要么坐满2人时，他才会考虑空着的餐桌；
     *
     * 当女职员进入食堂时，她会优先选择未坐人的餐桌用餐，只有当每张餐桌都坐有至少1人时，她才会考虑已经坐有1人的餐桌；
     *
     * 无论男女，当有多张餐桌供职员选择时，他会选择最靠左的餐桌用餐。现在食堂内已有若干人在用餐，另外M个人正排队进入食堂，小团会根据小美告诉他的规律预测排队的每个人分别会坐哪张餐桌。
     *
     * 进阶：时间复杂度
     * O
     * (
     * n
     * l
     * o
     * g
     * n
     * )
     *
     * O(nlogn) ,空间复杂度
     * O
     * (
     * n
     * )
     *
     * O(n)
     * 时间限制：C/C++ 2秒，其他语言4秒
     * 空间限制：C/C++ 256M，其他语言512M
     * 输入描述：
     * 第一行输入一个整数T（1<=T<=10），表示数据组数。
     *
     * 每组数据占四行，第一行输入一个整数N（1<=N<=500000）；
     *
     * 第二行输入一个长度为N且仅包含数字0、1、2的字符串，第i个数字表示左起第i张餐桌已坐有的用餐人数；
     *
     * 第三行输入一个整数M（1<=M<=2N且保证排队的每个人进入食堂时都有可供选择的餐桌）；
     *
     * 第四行输入一个长度为M且仅包含字母M、F的字符串，若第i个字母为M，则排在第i的人为男性，否则其为女性。
     *
     * 输出描述：
     * 每组数据输出占M行，第i行输出一个整数j（1<=j<=N），表示排在第i的人将选择左起第j张餐桌用餐。
     *
     * 示例1
     * 输入例子：
     * 1
     * 5
     * 01102
     * 6
     * MFMMFF
     * 输出例子：
     * 2
     * 1
     * 1
     * 3
     * 4
     * 4
     * @param args
     */

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //多少组
        int i = sc.nextInt();

        int[][] arr = new int[i][];
        Character[][] arr1 = new Character[i][];

        for (int i1 = 0; i1 < i; i1++){
            int count = sc.nextInt();
            // 初始化当前行
            arr[i1] = new int[count];

            String next = sc.next();
            char[] charArray = next.toCharArray();
            for (int j = 0; j < count; j++) {
                arr[i1][j] = charArray[j] - '0';
            }

            int wait = sc.nextInt();

            char[] charArray1 = sc.next().toCharArray();

            // 初始化当前行
            arr1[i1] = new Character[wait];

            for (int i2 = 0; i2 < charArray1.length; i2++) {
                arr1[i1][i2] = charArray1[i2];
            }


        }

        int[][] res = out(i,arr,arr1);

        //打印数组
        for (int i1 = 0; i1 < i; i1++){
            for (int j = 0; j < res[i1].length; j++) {
                System.out.println(res[i1][j]);
            }
        }


    }

    private static int[][] out(int i, int[][] now, Character[][] wait) {

        int[][] res = new int[i][];

        for (int i1 = 0; i1 < i; i1++){

            res[i1] = new int[wait[i1].length];

            //创建两个优先队列存放0和1的位置
            Queue<Integer> queue_0 = new PriorityQueue<>();

            Queue<Integer> queue_1 = new PriorityQueue<>();

            for (int j = 0; j < now[i1].length; j++) {
                if (now[i1][j] == 0){
                    queue_0.add(j);
                }else if (now[i1][j] == 1) {
                    queue_1.add(j);
                }
            }

            for (int j = 0; j < wait[i1].length; j++) {
                //如果是男生，那么就从1队列中取，如果1队列为空，那么就从0队列中取
                if (wait[i1][j].equals('M')){
                    if (queue_1.isEmpty()){
                        int poll = queue_0.poll().intValue();
                        res[i1][j] = poll + 1;
                        queue_1.add(poll);
                    }else {
                        int poll = queue_1.poll().intValue();
                        res[i1][j] = poll + 1;
                    }
                }
                //如果是女生，那么就从0队列中取，如果0队列为空，那么就从1队列中取
                else {
                    if (queue_0.isEmpty()){
                        int poll = queue_1.poll().intValue();
                        res[i1][j] = poll + 1;
                    }else {
                        int poll = queue_0.poll().intValue();
                        res[i1][j] = poll + 1;
                        queue_1.add(poll);
                    }
                }

            }
        }
        return res;
    }




}
